home *** CD-ROM | disk | FTP | other *** search
/ The Original Shareware 1.1 / The Original Shareware (WeMake CDs)(Volume 1.1)(CDs, Inc)(1993).iso / 23 / cputimer.zip / CPU2.ASM next >
Assembly Source File  |  1986-03-05  |  6KB  |  317 lines

  1.     TITLE    CPU2
  2. ;
  3. ; CPU2 WAS TAKEN FROM PUBLIC DOMAIN AND MODIFIED TO PROVIDE
  4. ; A REPRESENTATIVE INSTRUCTION MIX FOR QUANTIFYING SPEED
  5. ; OF ONE'S 8086/8088/80186/80286 COMPUTER IN TERMS OF STANDARD
  6. ; IBM-PC. RESULT IS IN EFFECTIVE CLOCK RATE (I.E. YOUR COMPUTER
  7. ; RUNS AS FAST AS AN IBM PC WITH THE FOLLOWING CLOCK RATE)
  8. ;
  9. ; (ADDED SIEVE OF ERATOSTHENES BENCHMARK WITH TIMER TO PROVIDE
  10. ; AN ADDITIONAL BENCHMARK) - KIM LEVITT (MBBS HQ PDSE (213) 653-6398)
  11. ;
  12. ; (SOURCE FOR CPU BENCHMARK AND SIEVE COPIED FROM MICRO/SYSTEMS
  13. ; JOURNAL NOV/DEC 1985 ISSUE, ARTICLE: "TURBO CHARGE YOUR 8086/8088
  14. ; COMPUTER" BY STEPHEN R. DAVIS, ROUTE 5 BOX 107K, GREENVILLE, TX 75401)
  15. ;
  16.  
  17. LF    EQU    0AH
  18. CR    EQU    0DH
  19. HUNDRED    EQU    64H
  20. THOUSAND EQU    3E8H
  21. TEN    EQU    0AH
  22.  
  23. NTIMES     EQU    8190        ;STANDARD SIZE
  24. NLOOPS    EQU    10        ;TEN ITERATIONS STANDARD
  25.  
  26. CSEG    SEGMENT PUBLIC PARA
  27.     ASSUME CS:CSEG,DS:CSEG,SS:CSEG,ES:NOTHING
  28.     ORG    100H
  29.  
  30. ; FIRST OUTPUT A 'WAIT A MINUTE' MESSAGE AND THEN GET TIME
  31.  
  32. START:
  33.     MOV    AH,9
  34.     MOV    DX,OFFSET INIT_MSG
  35.     INT    21H
  36.  
  37.     MOV    AH,2CH
  38.     INT    21H
  39.  
  40.     MOV    TIME1,DX
  41.     STI            ;BE SURE CLOCK IS RUNNING
  42.  
  43. ;HERE IS THE BIG TIMING LOOP
  44.  
  45.     XOR    AX,AX
  46.     MOV    DX,TEN
  47.  
  48. OUTERLOOP:
  49.  
  50.     MOV    CX,03B84H    ;THIS NUMBER MUST BE AD-
  51.                 ;JUSTED FOR DIFFERENT MIXES
  52. TIMERLOOP:
  53.  
  54. ;MY MIX OF REPRESENTATIVE, USEFUL INSTRUCTIONS -
  55. ;USER MAY PROVIDE HIS OWN AND REASSEMBLE, BEING CAREFUL
  56. ;TO ADJUST CONSTANT ABOVE FOR TOTAL NUMBER
  57.  
  58.     MOV    AX,BX        ;REGISTER TO REGISTER MOVE
  59.     MOV    AX,BX        ;(FAR AND AWAY MOST COMMON)
  60.     MOV    AX,BX
  61.     MOV    AX,BX
  62.     MOV    AX,BX
  63.     MOV    AX,BX
  64.  
  65.     MOV    AX,10[BX]    ;COMPLEX ADDRESSING
  66.     MOV    AX,10[BX]    ;(PRETTY COMMON)
  67.     MOV    AX,10[BX]
  68.     MOV    AX,10[BX]
  69.  
  70.     ADD    AX,AX        ;REG-REG ARITHMETIC
  71.  
  72.     ADD    AX,10        ;REG-IMMED ARITHMETIC
  73.  
  74.     PUSH    CX        ;PUSH (POP FOLLOWS) ARE COMMON
  75.  
  76.     MOV    CL,5
  77.     SHL    AX,CL
  78.     POP    CX
  79.     CALL    DUMMY_ROUTINE    ;THESE CALLS/JUMPS SHOULD ALSO
  80.                 ;FAVOR NEC
  81.     JMP    CONTINUE
  82.  
  83. DUMMY_ROUTINE PROC NEAR
  84.     RET
  85. DUMMY_ROUTINE ENDP
  86.  
  87. CONTINUE:
  88.     LOOP    TIMERLOOP
  89.     DEC    DX
  90.     JNZ    OUTERLOOP
  91.  
  92. ; NOW GET TIME AGAIN (AFTER LOOP)
  93.  
  94.     MOV    AH,2CH
  95.     INT    21H
  96.  
  97. ; OK - CONVERT THIS INTO CLOCK SPEED RELATIVE TO 8088
  98. ; AND OUTPUT IN ASCII FORM
  99.  
  100.     MOV    AX,HUNDRED
  101.     IMUL    DH
  102.     MOV    DH,0
  103.     ADD    AX,DX
  104.     MOV    BX,AX
  105.     MOV    DX,TIME1
  106.  
  107.     MOV    AX,HUNDRED
  108.     IMUL    DH
  109.     MOV    DH,0
  110.     ADD    AX,DX
  111.     SUB    BX,AX
  112.     JNB    SKIP
  113.     ADD    BX,1770H
  114. SKIP:
  115.     MOV    AX,BX
  116.     MOV    TIME2,BX
  117.     MOV    BP,OFFSET VALUE1
  118.     MOV    BX,THOUSAND
  119.     CWD
  120.     IDIV    BX
  121.     CALL    CONVERT2NUM    ;CONVERT FIRST VALUE & STORE
  122.     MOV    BX,HUNDRED    ;HUNDREDS DIGIT
  123.     MOV    AX,DX
  124.     CWD
  125.     IDIV    BX
  126.     CALL    CONVERT2NUM
  127.     INC    BP
  128.     MOV    BX,TEN        ;TENS DIGIT
  129.     MOV    AX,DX
  130.     CWD
  131.     IDIV    BX
  132.     CALL    CONVERT2NUM
  133.     MOV    AX,DX
  134.     CALL    CONVERT2NUM
  135.  
  136.     MOV    AH,9
  137.     MOV    DX,OFFSET RES_MSG
  138.     INT    21H
  139.  
  140.     MOV    AX,12A2H/TEN    ;CALCULATE EFFECTIVE CLOCK RATE
  141.     CWD
  142.     MOV    BX,TIME2
  143.     DIV    BX
  144.     MOV    BP,OFFSET VALUE2
  145.     CALL    CONVERT2NUM    ;TENS DIGIT
  146.     MOV    AX,DX
  147.     MOV    CX,TEN
  148.     MUL    CX
  149.     DIV    BX
  150.     CALL    CONVERT2NUM    ;ONES DIGIT
  151.     INC    BP
  152.     MOV    AX,DX
  153.     MUL    CX
  154.     DIV    BX
  155.     CALL    CONVERT2NUM    ;TENTHS DIGIT
  156.     MOV    AX,DX
  157.     MUL    CX
  158.     DIV    BX
  159.     CALL    CONVERT2NUM    ;HUNDRETHS DIGIT
  160.  
  161.     MOV    AH,9
  162.     MOV    DX,OFFSET RES_MSG2
  163.     INT    21H
  164.  
  165.     MOV    AH,9
  166.     MOV    DX,OFFSET INIT_MSG2
  167.     INT    21H
  168.  
  169.     MOV    AH,2CH
  170.     INT    21H
  171.  
  172.     MOV    TIME1,DX
  173.     STI            ;BE SURE CLOCK IS RUNNING
  174. START2:
  175.     MOV    LOOP_CNT,NLOOPS    ;INIT LOOP COUNTER
  176. OUTER_LOOP:
  177.     XOR    AX,AX        ;FIRST ZERO OUT FLAG ARRAY
  178.     MOV    DI,OFFSET ARRAY
  179.     MOV    CX,NTIMES/2
  180.     CLD
  181.     REP    STOSW
  182.                 ;NOW COUNT THE PRIMES
  183.     XOR    DX,DX        ;KEEP THE COUNT IN DX
  184.     XOR    BX,BX        ;START AT SUBSCRIPT 0
  185.     MOV    CX,NTIMES    ;GET THE LOOP COUNT
  186.     MOV    DI,CX
  187. INNER_LOOP:
  188.     CMP    BYTE PTR ARRAY[BX],0
  189.     JNZ    SKIP_AROUND
  190.     MOV    AX,BX
  191.     ADD    AX,BX
  192.     ADD    AX,3
  193.     MOV    PRIME,AX
  194.     MOV    SI,BX        ;NOW MARK OUT MULTIPLES
  195.     ADD    SI,AX
  196. MARK_OUT:
  197.     MOV    BYTE PTR ARRAY[SI],0FFH ;MARK THIS MULTIPLE OUT
  198.     ADD    SI,AX
  199.     CMP    SI,DI        ;IS THAT IT
  200.     JNA    MARK_OUT
  201.     INC    DX        ;INCREMENT PRIME NUMBER COUNT
  202. SKIP_AROUND:
  203.     INC    BX
  204.     LOOP    INNER_LOOP
  205.     MOV    COUNT,DX    ;NOW COUNT IS IN DX REGISTER
  206.     DEC    LOOP_CNT    ;DO IT TEN TIMES
  207.     JNZ    OUTER_LOOP
  208.  
  209. ; NOW GET TIME AGAIN (AFTER LOOP)
  210.  
  211.     MOV    AH,2CH
  212.     INT    21H
  213.  
  214. ; OK - CONVERT THIS INTO REAL TIME
  215. ; AND OUTPUT IN ASCII FORM
  216.  
  217.     MOV    AX,HUNDRED
  218.     IMUL    DH
  219.     MOV    DH,0
  220.     ADD    AX,DX
  221.     MOV    BX,AX
  222.     MOV    DX,TIME1
  223.  
  224.     MOV    AX,HUNDRED
  225.     IMUL    DH
  226.     MOV    DH,0
  227.     ADD    AX,DX
  228.     SUB    BX,AX
  229.     JNB    SKIP2
  230.     ADD    BX,1770H
  231. SKIP2:
  232.     MOV    AX,BX
  233.     MOV    TIME2,BX
  234.     MOV    BP,OFFSET VALUE3
  235.     MOV    BX,THOUSAND
  236.     CWD
  237.     IDIV    BX
  238.     CALL    CONVERT2NUM    ;CONVERT FIRST VALUE & STORE
  239.     MOV    BX,HUNDRED    ;HUNDREDS DIGIT
  240.     MOV    AX,DX
  241.     CWD
  242.     IDIV    BX
  243.     CALL    CONVERT2NUM
  244.     INC    BP
  245.     MOV    BX,TEN        ;TENS DIGIT
  246.     MOV    AX,DX
  247.     CWD
  248.     IDIV    BX
  249.     CALL    CONVERT2NUM
  250.     MOV    AX,DX
  251.     CALL    CONVERT2NUM
  252.  
  253.     MOV    AH,9
  254.     MOV    DX,OFFSET RES_MSG3
  255.     INT    21H
  256.  
  257.     MOV    AH,4CH        ;TERMINATE
  258.     INT    21H
  259.  
  260. CONVERT2NUM:
  261.     OR    AL,30H        ;'0'
  262.     MOV    [BP+0],AL
  263.     INC    BP
  264.     RET
  265.  
  266. INIT_MSG EQU    $
  267.     DB    CR,LF
  268.     DB    'CPU2: SPEED CHECKER/BENCHMARK PROGRAM',CR,LF
  269.     DB    '01/07/86 -- Stephen R. Davis, Kim Levitt',CR,LF
  270.     DB    CR,LF
  271.     DB    'BENCHMARK #1: - Mixed Instruction Repetition',CR,LF
  272.     DB    CR,LF
  273.     DB    '  Please wait...',CR,LF
  274.     DB    CR,LF,'$'
  275.  
  276. RES_MSG    EQU    $
  277.     DB    '  Execution time is 10.00 secs on a 4.77 Mhz 8088',CR,LF
  278.     DB    '    with no waits on RAM access.',CR,LF
  279.     DB    CR,LF
  280.     DB    '  Actual execution time here = '
  281. VALUE1    DB    '00.00'
  282.     DB    ' seconds.',CR,LF,'$'
  283.  
  284. RES_MSG2 EQU    $
  285.     DB    '  Effective 8088 clock speed = '
  286. VALUE2    DB    '00.00'
  287.     DB    ' Mhz',CR,LF
  288.     DB    CR,LF,'$'
  289.  
  290. INIT_MSG2 EQU    $
  291.     DB    'BENCHMARK #2 - Sieve of Eratosthenes, 10 reps',CR,LF
  292.     DB    CR,LF 
  293.     DB    '  Please wait...',CR,LF
  294.     DB    CR,LF,'$'
  295.  
  296. RES_MSG3 EQU    $
  297.     DB    '  Execution time is 3.68 secs on a 4.77 Mhz 8088',CR,LF
  298.     DB    '    with no waits on RAM access.',CR,LF
  299.     DB    CR,LF
  300.     DB    '  Actual execution time here = '
  301. VALUE3    DB    '00.00'
  302.     DB    ' seconds.',CR,LF,'$'
  303.  
  304. ;DEFINE OUR VARIABLES DOWN HERE
  305.  
  306. TIME1    DW    0000
  307. TIME2    DW    0000
  308.  
  309. LOOP_CNT DW    0
  310. PRIME    DW    0
  311. COUNT    DW    0
  312. ARRAY    DB     NTIMES DUP (0)
  313.  
  314. CSEG    ENDS
  315.  
  316.     END    START
  317.